#include <iostream>
#include <string>
using namespace std;

#ifndef CCOLOR_H
#define CCOLOR_H

namespace ColorCode
{
  /**
   * Définit tous les attributs possibles.
   */
  enum Attributs
  {
    ATTRIB_NONE          = 0, /**< Aucun */
    ATTRIB_BOLD          = 1, /**<  Gras*/
    ATTRIB_ITALIC        = 2, /**< Italique */
    ATTRIB_UNDERLINE     = 4, /**< Souligné */
    ATTRIB_BLINK         = 8, /**< Clignotant */
    ATTRIB_REVERSE       = 16, /**< Inverse couleur d'avant- et d'arrière-plan*/
    ATTRIB_CONCEALED     = 32, /**< Ecriture "invisible" */
    ATTRIB_STRIKETHROUGH = 64 /**< Barré */
  };

  /**
   * Couleurs disponibles.
   */
  enum Couleurs
  {
    BLACK         = 0, /**< Noir */
    RED           = 1, /**< Rouge */
    GREEN         = 2, /**< Vert */
    YELLOW        = 3, /**< Jaune */
    BLUE          = 4, /**< Bleu */
    PINK          = 5, /**< Rose*/
    CYAN          = 6, /**< Cyan */
    WHITE         = 7, /**< Blanc*/
    DEFAULT_COLOR = 8 /**<  Couleur par défaut*/
  };

  /**
   * Cette classe permet de changer la couleur d'affichage dans le
   * terminal, en utilisant les codes ANSI.
   *
   * Je n'ai pas codé cette classe, je l'ai juste adaptée et orientée
   * C++, avant les codes étaient des char**, j'en ai fait des
   * strings. On peut spécifier la couleur de la police (foreground), la
   * couleur (background) et un attribut. Le résultat de l'affichage est
   * dépendant de la configuration du terminal.
   *
   * @author Soilwork
   * @author Johan "Solo" Luisier
   */
  class CColor
  {
  private:
    int bgColor, /**< Couleur des caractères */
      fgColor; /**< Couleur d'arrière-plan */

    /**
     * Differents attributs disponibles (italique, gras, ...).
     *
     * Remarque : Quand ces variables valent -1, cela signifie qu'elles
     * ne sont pas prises en compte lors de la generation de la sequence
     * d'echappement Comme ca, on peut generer simplement : "\033[8m"
     * par exemple
     */
    int attributes;

    static string codeFG[9], /**< Codes de couleur pour les caractères */
      codeBG[9]; /**< Codes de couleur pour le fond */
  
  public:
    /**
     * Constructeur par défaut.
     * @param foreground couleur des caractères
     * @param background couleur d'arrière-plan
     * @param att attribut
     */
    CColor(int foreground=-1, int background=-1, int att=-1);
  
    /**
     * Constructeur de copie.
     * @param color couleur à copier
     */
    CColor(const CColor &color);
  
    /**
     * Permet de configurer la couleur d'avant-plan
     * @param color la couleur
     */
    void setFGColor(int color);
    /**
     * Permet de configurer la couleur d'arrière-plan
     * @param color la couleur
     */
    void setBGColor(int color);
    /**
     * Permet de configurer l'attribut du texte
     * @param att  l'attribut
     */
    void setAttributes(int att);
  
    /**
     * Retrouve la couleur d'avant-plan
     * @return la couleur
     */
    int getBGColor() const{return bgColor;}
    /**
     * Retrouve la couleur d'arrière-plan
     * @return la couleur
     */
    int getFGColor() const{return fgColor;}
    /**
     * Retrouve l'attribut du texte
     * @return l'attribut
     */
    int getAttributes() const{return attributes;}
  
    /**
     * Supprime un attibut précis
     * @param att l'attribut à supprimer
     */
    void removeAttribute(int att);
  
    /**
     * Met toutes les valeurs à -1
     */
    void reset();
    /**
     * Remet tous les attribut à leur valeur par défaut
     */
    void resetDefault();
  
    /**
     * Donne le code ANSI correspondants aux couleurs et attributs voulus.
     * @return le code ANSI
     */
    string getColorCode() const;
  
    /**
     * Efface l'écran
     * @return le code ANSI d'effaçage de l'écran
     */
    string clearScreen() const;
  };

}

#endif //CCOLOR_H
